﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using GigaSite.Domain.Entities;
using GigaSite.Domain.Interfaces.Repositories;
using GigaSite.Domain.IoC;
using GigaSite.Web.Areas.ControlPanel.Models;

namespace GigaSite.Web.Areas.ControlPanel.Controllers
{
    /// <summary>
    /// Контроллер управления списком новостей
    /// </summary>
    public class ManageNewsController : BaseRootController
    {
        //
        // GET: /ControlPanel/ManageNews/
        /// <summary>
        /// Отображает панель управления новостями
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            return View();
        }

        /// <summary>
        /// Возвращает список новостей системы в Json формате
        /// </summary>
        /// <returns>Список новостей в Json формате</returns>
        [HttpPost]
        public JsonResult GetNews()
        {
            try
            {
                // Репозиторий
                var repository = Locator.GetService<INewsRepository>();

                // Список новостей
                var news = repository.FindAll().OrderByDescending(n => n.DateCreated).Select(n => new NewsArticleModel(n));

                // Отдаем
                return JsonSuccess(news);
            }
            catch (Exception e )
            {
                return JsonErrors(e);
            }
        }

        /// <summary>
        /// Сохраняет изменения в новости или создает новую
        /// </summary>
        /// <param name="id">Идентификатор новости</param>
        /// <param name="title">Заголовок</param>
        /// <param name="tags">Ключевые слова</param>
        /// <param name="shortContent">Краткая анотация</param>
        /// <param name="fullContent">Полное содержимое</param>
        /// <param name="published">Опубликована</param>
        /// <param name="delayPublication">Отложеная публикация</param>
        /// <param name="delayPublicationDate">Дата отложенной публикации</param>
        /// <param name="disableCommenting">Отключить комментирование</param>
        /// <returns>Информация об успехе операции или ее провале</returns>
        [HttpPost]
        public JsonResult Save(long id, string title, string tags, string shortContent, string fullContent, bool published, bool delayPublication, DateTime? delayPublicationDate, bool disableCommenting)
        {
            try
            {
                // Репозиторий
                var repository = Locator.GetService<INewsRepository>();

                if (id <= 0)
                {
                    // Создаем новую новость
                    var news = new NewsArticle()
                                   {
                                       DateCreated = DateTime.Now,
                                       DelayPublicationDate = delayPublicationDate,
                                       DelayPublished = delayPublication,
                                       DisableCommenting = disableCommenting,
                                       FullContent = fullContent,
                                       ShortContent = shortContent,
                                       Published = published,
                                       Tags = tags,
                                       Title = title,
                                       Views = 0
                                   };
                    repository.Add(news);
                }
                else
                {
                    // Обновляем существующую
                    var news = repository.Load(id);
                    if (news == null)
                    {
                        throw new ObjectNotFoundException(String.Format("Новость с идентификатором {0} не найдена",id));
                    }

                    news.DelayPublicationDate = delayPublicationDate;
                    news.DelayPublished = delayPublication;
                    news.DisableCommenting = disableCommenting;
                    news.FullContent = fullContent;
                    news.Published = published;
                    news.ShortContent = shortContent;
                    news.Tags = tags;
                    news.Title = title;
                    news.DateModified = DateTime.Now;
                }

                // Сохраняем изменения
                repository.SubmitChanges();

                return JsonSuccess();
            }
            catch (Exception e)
            {
                return JsonErrors(e);
            }
        }

        /// <summary>
        /// Обрабатывает запрос на удаление новости с клиента
        /// </summary>
        /// <param name="id">Идентификатор новости</param>
        /// <returns>Сообщение об успехе операции или неуспехе</returns>
        [HttpPost]
        public JsonResult Delete(long id)
        {
            try
            {
                // Репозиторий
                var repository = Locator.GetService<INewsRepository>();

                // Загружаем сущность
                var news = repository.Load(id);
                if (news == null)
                {
                    throw new ObjectNotFoundException(String.Format("Новость с идентификатором {0} не найдена", id));
                }

                // Удаляем
                repository.Delete(news);
                repository.SubmitChanges();

                return JsonSuccess();
            }
            catch (Exception e)
            {
                return JsonErrors(e);
            }
        }
    }
}
